package com.estore.service;

import com.estore.model.Product;

import java.io.*;
import java.util.*;

/**
 * 商品服务类，负责商品相关的业务逻辑
 * 目前使用内存Map模拟数据库
 */
public class ProductService {

    private static Map<String, Product> productData = new HashMap<>();
    // 存储购物车数据
    private static Map<String, Integer> shoppingCartData = new HashMap<>();
    //用于存储从配置文件中读取的文件路径
    private static String dataFilePath;

    private Set<String> tags(String...tags){
        Set<String> tagset = new HashSet<>();
        if (tags != null){
            tagset.addAll(Arrays.asList(tags));
        }
        return tagset;
    }

    /**
     * 构造函数，初始化一些商品数据
     */
    public ProductService(){
        System.out.println("正在初始化商品数据...");
        loadConfig();
        loadData();

//        Set<String> tagsForP001 = new HashSet<>();
//        tagsForP001.add("IT");
//        tagsForP001.add("编程");
        productData.put("p001", new Product("p001", "Java从入门到精通", 99.0, 100, tags("IT", "编程")));
//        Set<String> tagsForP002 = new HashSet<>();
//        tagsForP002.add("数据库");
//        tagsForP002.add("中间键");
//        tagsForP002.add("中间键");
        productData.put("p002", new Product("p002", "高性能MySQL", 128.5, 50, tags("数据库", "SQL","SQL")));
        productData.put("p003", new Product("p003", "颈椎康复指南", 45.0, 200));
        productData.put("p004", new Product("p004", "生发秘籍", 88.0, 0)); // 库存为0的商品
        productData.put("p005", new Product("p005", "C++", 67.0, 450));
        productData.put("p006", new Product("p006", "Python", 35.0, 670));
    }

    /**
     * 获取所有商品列表
     * @return 商品列表
     */
    public List<Product> getAllProducts() {
        // 创建一个ArrayList，用于存储排序后的商品列表
        List<Product> productList = new ArrayList<>();
        productList.addAll(productData.values());
        //按序号排序
        Collections.sort(productList);
        //价格升序
        //productList.sort(ProductSorters.BY_PRICE_ASC);
        // 从Map的值集合创建一个新的ArrayList并返回
        return productList;
    }

    /**
     * 根据ID查找商品
     * @param id 商品ID
     * @return 找到的商品对象，如果不存在则返回null
     */
    public Product findProductById(String id) {
        return productData.get(id);
    }

    /**
     * 保存商品数据和购物车数据到文件
     */
    public static void saveData(Map<String, Integer> shoppingCart) {
        try {
            // 更新购物车数据
            shoppingCartData = shoppingCart;

            FileOutputStream fos = new FileOutputStream(dataFilePath);
            ObjectOutputStream oos = new ObjectOutputStream(fos);

            // 再写入购物车数据
            oos.writeObject(shoppingCartData);

            oos.close();
            fos.close();
            System.out.println("数据保存成功");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 从文件加载商品数据和购物车数据
     */
    public static Map<String, Integer> loadData() {
        try {
            // 添加空值检查
            if (dataFilePath == null || dataFilePath.isEmpty()) {
                System.err.println("Data file path is not set.");
                return new HashMap<>();
            }

            if (!new File(dataFilePath).exists()) {
                return new HashMap<>();
            }

            FileInputStream fis = new FileInputStream(dataFilePath);
            ObjectInputStream ois = new ObjectInputStream(fis);

            // 读取购物车数据
            shoppingCartData = (Map<String, Integer>) ois.readObject();

            ois.close();
            fis.close();
            System.out.println("数据加载成功");
            return shoppingCartData;
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("加载数据时出现错误，使用默认数据");
            return new HashMap<>();
        }
    }

    /**
     * 获取购物车数据（用于测试）
     */
    public static Map<String, Integer> getShoppingCartData() {
        return shoppingCartData;
    }

    private void loadConfig(){
        Properties properties = new Properties();
        try {
            // 使用 classpath 加载资源
            InputStream is = ProductService.class.getClassLoader().getResourceAsStream("config.properties");
            if (is == null) {
                throw new FileNotFoundException("config.properties not found in classpath");
            }
            InputStreamReader inputStreamReader = new InputStreamReader(is, "UTF-8");
            properties.load(inputStreamReader);
            dataFilePath = properties.getProperty("data.file.path");
        } catch (IOException e) {
            e.printStackTrace();
            // 如果失败则使用默认路径
            dataFilePath = "products.dat";
        }
    }
}